﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Media;
using System.Collections.ObjectModel;
using System.Data;
using System.Windows.Documents;
using System.Windows.Media.Imaging;
using System.ComponentModel;
using System.Diagnostics;
using System.Windows.Controls;
using System.Globalization;
using produccion.modelo;
using produccion.AccesoDatos;
using produccion.clases;
using produccion.modulos;
using System.Windows.Input;
using System.Windows.Media.Imaging;
using System.Windows.Shapes;
using System.Collections.Specialized;

namespace produccion.forms
{
    /// <summary>
    /// Lógica de interacción para FRMMontajeaDespachos.xaml
    /// </summary>
    public partial class FRMMontajeaDespachos : Window
    {
        private MDOgeneral mod = new MDOgeneral();
        Int32 numLote = 0;
        string strTalla = "";
        String StrLoteAProcesar; 
        MDOgeneral MdoGeneral = new MDOgeneral();//FJRF - Para traer las funciones de MdoGeneral

        public FRMMontajeaDespachos()
        {
            InitializeComponent();
        }

        private void dtgResumen_PreviewKeyDown(object sender, KeyEventArgs e)
        {
            var elemento = e.OriginalSource as UIElement;
            if (e.Key == Key.Enter && elemento != null)
            {
                e.Handled = true;
                elemento.MoveFocus(new TraversalRequest(FocusNavigationDirection.Next));
            }
        }

        //
        // SINGLE CLICK EDITING
        //
        private void DataGridCell_PreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e)
        {
            DataGridCell cell = sender as DataGridCell;
            if (cell != null && !cell.IsEditing && !cell.IsReadOnly)
            {
                if (!cell.IsFocused)
                {
                    cell.Focus();
                }
                DataGrid dataGrid = FindVisualParent<DataGrid>(cell);
                if (dataGrid != null)
                {
                    if (dataGrid.SelectionUnit != DataGridSelectionUnit.FullRow)
                    {
                        if (!cell.IsSelected)
                            cell.IsSelected = true;
                    }
                    else
                    {
                        DataGridRow row = FindVisualParent<DataGridRow>(cell);
                        if (row != null && !row.IsSelected)
                        {
                            row.IsSelected = true;
                        }
                    }
                }
            }
        }

        static T FindVisualParent<T>(UIElement element) where T : UIElement
        {
            UIElement parent = element;
            while (parent != null)
            {
                T correctlyTyped = parent as T;
                if (correctlyTyped != null)
                {
                    return correctlyTyped;
                }

                parent = VisualTreeHelper.GetParent(parent) as UIElement;
            }
            return null;
        }

        private void Window_KeyDown(object sender, KeyEventArgs e)
        {
            var elemento = e.OriginalSource as UIElement;
            if (e.Key == Key.F3 && elemento != null)
            {
                if (MDOgeneral.logBusquedadAbierta == true) { MDOgeneral.logBusquedadAbierta = false; }
            }

            if (e.Key == Key.F4 && elemento != null)
            {
                if (MDOgeneral.logBusquedadAbierta1 == true) { MDOgeneral.logBusquedadAbierta1 = false; }
            }

            if (e.Key == Key.F5 && elemento != null)
            {
                if (MDOgeneral.logBusquedadAbierta2 == true) { MDOgeneral.logBusquedadAbierta2 = false; }
            }
        }

        private void Window_Loaded(object sender, RoutedEventArgs e)
        {
            PttV_CargarDatos();//FJRF - Cargamos los datos
        }
        protected void PttV_CargarDatos()
        {
            if (dtgResumen.Items.Count == 0)
                return;

            TextBlock dato = dtgResumen.Columns[0].GetCellContent(dtgResumen.Items[0]) as TextBlock;
            if (dato != null)
            {
                numLote = Convert.ToInt32(dato.Text);
                BtnProcesar.Visibility = Visibility.Visible;//FJRF - Ponemos el boton visible

                MDOgeneral.spComando.CommandText = "SP_CARGARLOTEMD";
                MDOgeneral.spComando.Connection = MDOgeneral.conexion;
                MDOgeneral.spComando.CommandType = CommandType.StoredProcedure;
                MDOgeneral.spComando.Parameters.Clear();

                //Input
                MDOgeneral.spComando.Parameters.Add("pnu_lote", Oracle.DataAccess.Client.OracleDbType.Int32).Value = numLote;
                MDOgeneral.spComando.Parameters["pnu_lote"].Direction = ParameterDirection.Input;

                //Output
                MDOgeneral.spComando.Parameters.Add("pva_resul", Oracle.DataAccess.Client.OracleDbType.Varchar2, 2000).Direction = ParameterDirection.Output;
                MDOgeneral.spComando.Parameters.Add("pva_errusu", Oracle.DataAccess.Client.OracleDbType.Varchar2, 2000).Direction = ParameterDirection.Output;
                MDOgeneral.spComando.ExecuteNonQuery();

                String StrSeguir = MDOgeneral.spComando.Parameters["pva_resul"].Value.ToString();//FJRF - Consultamos si podemos seguir o no

                if (StrSeguir == "S")//FJRF - Si se permite seguir hacemos lo siguiente
                {
                    StrLoteAProcesar = numLote.ToString();//FJRF - Asignamos el lote

                    string query = "select TALREF_TMP from tmplotep where rownum = 1 order by nroord_tmp, codref_tmp, codcol_tmp ";
                    DataTable val = mod.consulta(query);

                    foreach (DataRow r in val.Rows)
                    {
                        strTalla = r["TALREF_TMP"].ToString();
                    }

                    MDOgeneral.spComando.CommandText = "SP_TALLAJES";
                    MDOgeneral.spComando.Connection = MDOgeneral.conexion;
                    MDOgeneral.spComando.CommandType = CommandType.StoredProcedure;
                    MDOgeneral.spComando.Parameters.Clear();

                    //Input
                    MDOgeneral.spComando.Parameters.Add("pva_tallajes", Oracle.DataAccess.Client.OracleDbType.Varchar2, 20).Value = strTalla;
                    MDOgeneral.spComando.Parameters["pva_tallajes"].Direction = ParameterDirection.Input;

                    //Output
                    MDOgeneral.spComando.Parameters.Add("pva_result", Oracle.DataAccess.Client.OracleDbType.Varchar2, 2000).Direction = ParameterDirection.Output;
                    MDOgeneral.spComando.Parameters.Add("pva_errusu", Oracle.DataAccess.Client.OracleDbType.Varchar2, 2000).Direction = ParameterDirection.Output;
                    MDOgeneral.spComando.ExecuteNonQuery();

                    string query1 = "select * from tmptitulostalla";
                    DataTable dt = mod.consulta(query1);

                    foreach (DataRow r in dt.Rows)
                    {
                        dtgDetalle.Columns[5].Header = r["T1_TMP"].ToString();
                        dtgDetalle.Columns[6].Header = r["T2_TMP"].ToString();
                        dtgDetalle.Columns[7].Header = r["T3_TMP"].ToString();
                        dtgDetalle.Columns[8].Header = r["T4_TMP"].ToString();
                        dtgDetalle.Columns[9].Header = r["T5_TMP"].ToString();
                        dtgDetalle.Columns[10].Header = r["T6_TMP"].ToString();
                        dtgDetalle.Columns[11].Header = r["T7_TMP"].ToString();
                        dtgDetalle.Columns[12].Header = r["T8_TMP"].ToString();
                        dtgDetalle.Columns[13].Header = r["T9_TMP"].ToString();
                        dtgDetalle.Columns[14].Header = r["T10_TMP"].ToString();
                        dtgDetalle.Columns[15].Header = r["T11_TMP"].ToString();
                        dtgDetalle.Columns[16].Header = r["T12_TMP"].ToString();
                        dtgDetalle.Columns[17].Header = r["T13_TMP"].ToString();
                        dtgDetalle.Columns[18].Header = r["T14_TMP"].ToString();
                        dtgDetalle.Columns[19].Header = r["T15_TMP"].ToString();
                        dtgDetalle.Columns[20].Header = r["T16_TMP"].ToString();
                        dtgDetalle.Columns[21].Header = r["T17_TMP"].ToString();
                        dtgDetalle.Columns[22].Header = r["T18_TMP"].ToString();
                        dtgDetalle.Columns[23].Header = r["T19_TMP"].ToString();
                        dtgDetalle.Columns[24].Header = r["T20_TMP"].ToString();
                    }
                }
                else//FJRF - Si no permite seguir hacemos lo siguiente
                {
                    StrLoteAProcesar = "";//FJRF - Asignamos el lote
                    BtnProcesar.Visibility = Visibility.Hidden;//FJRF - Ponemos el boton invisible

                    //String StrMensajeError = MDOgeneral.spComando.Parameters["pva_errusu"].Value.ToString();//FJRF - Consultamos si podemos seguir o no
                    //MessageBox.Show(StrMensajeError, "PROCESO CANCELADO", MessageBoxButton.OK, MessageBoxImage.Error);
                }
            }
        }
        private void dtgResumen_MouseDoubleClick(object sender, MouseButtonEventArgs e)
        {
            try
            {
                if (dtgDetalle != null)
                {
                    if (dtgResumen.Items.Count > 0)
                    {
                        MMontajeaDespachos.resumen fila = (MMontajeaDespachos.resumen)dtgResumen.SelectedItems[0];
                        numLote = fila.numLote;

                        if (numLote > 0)
                        {
                            MDOgeneral.spComando.CommandText = "SP_CARGARLOTEMD";
                            MDOgeneral.spComando.Connection = MDOgeneral.conexion;
                            MDOgeneral.spComando.CommandType = CommandType.StoredProcedure;
                            MDOgeneral.spComando.Parameters.Clear();

                            //Input
                            MDOgeneral.spComando.Parameters.Add("pnu_lote", Oracle.DataAccess.Client.OracleDbType.Int32).Value = numLote;
                            MDOgeneral.spComando.Parameters["pnu_lote"].Direction = ParameterDirection.Input;

                            //Output
                            MDOgeneral.spComando.Parameters.Add("pva_resul", Oracle.DataAccess.Client.OracleDbType.Varchar2, 2000).Direction = ParameterDirection.Output;
                            MDOgeneral.spComando.Parameters.Add("pva_errusu", Oracle.DataAccess.Client.OracleDbType.Varchar2, 2000).Direction = ParameterDirection.Output;
                            MDOgeneral.spComando.ExecuteNonQuery();

                            String StrSeguir = MDOgeneral.spComando.Parameters["pva_resul"].Value.ToString();//FJRF - Consultamos si podemos seguir o no

                            if (StrSeguir == "S")//FJRF - Si se permite seguir hacemos lo siguiente
                            {
                                StrLoteAProcesar = numLote.ToString();//FJRF - Asignamos el lote
                                BtnProcesar.Visibility = Visibility.Visible;//FJRF - Ponemos el boton visible

                                string query = "select TALREF_TMP from tmplotep where rownum = 1 order by nroord_tmp, codref_tmp, codcol_tmp ";
                                DataTable val = mod.consulta(query);

                                foreach (DataRow r in val.Rows)
                                {
                                    strTalla = r["TALREF_TMP"].ToString();
                                }

                                MDOgeneral.spComando.CommandText = "SP_TALLAJES";
                                MDOgeneral.spComando.Connection = MDOgeneral.conexion;
                                MDOgeneral.spComando.CommandType = CommandType.StoredProcedure;
                                MDOgeneral.spComando.Parameters.Clear();

                                //Input
                                MDOgeneral.spComando.Parameters.Add("pva_tallajes", Oracle.DataAccess.Client.OracleDbType.Varchar2, 20).Value = strTalla;
                                MDOgeneral.spComando.Parameters["pva_tallajes"].Direction = ParameterDirection.Input;

                                //Output
                                MDOgeneral.spComando.Parameters.Add("pva_result", Oracle.DataAccess.Client.OracleDbType.Varchar2, 2000).Direction = ParameterDirection.Output;
                                MDOgeneral.spComando.Parameters.Add("pva_errusu", Oracle.DataAccess.Client.OracleDbType.Varchar2, 2000).Direction = ParameterDirection.Output;
                                MDOgeneral.spComando.ExecuteNonQuery();

                                string query1 = "select * from tmptitulostalla";
                                DataTable dt = mod.consulta(query1);

                                foreach (DataRow r in dt.Rows)
                                {
                                    dtgDetalle.Columns[5].Header = r["T1_TMP"].ToString();
                                    dtgDetalle.Columns[6].Header = r["T2_TMP"].ToString();
                                    dtgDetalle.Columns[7].Header = r["T3_TMP"].ToString();
                                    dtgDetalle.Columns[8].Header = r["T4_TMP"].ToString();
                                    dtgDetalle.Columns[9].Header = r["T5_TMP"].ToString();
                                    dtgDetalle.Columns[10].Header = r["T6_TMP"].ToString();
                                    dtgDetalle.Columns[11].Header = r["T7_TMP"].ToString();
                                    dtgDetalle.Columns[12].Header = r["T8_TMP"].ToString();
                                    dtgDetalle.Columns[13].Header = r["T9_TMP"].ToString();
                                    dtgDetalle.Columns[14].Header = r["T10_TMP"].ToString();
                                    dtgDetalle.Columns[15].Header = r["T11_TMP"].ToString();
                                    dtgDetalle.Columns[16].Header = r["T12_TMP"].ToString();
                                    dtgDetalle.Columns[17].Header = r["T13_TMP"].ToString();
                                    dtgDetalle.Columns[18].Header = r["T14_TMP"].ToString();
                                    dtgDetalle.Columns[19].Header = r["T15_TMP"].ToString();
                                    dtgDetalle.Columns[20].Header = r["T16_TMP"].ToString();
                                    dtgDetalle.Columns[21].Header = r["T17_TMP"].ToString();
                                    dtgDetalle.Columns[22].Header = r["T18_TMP"].ToString();
                                    dtgDetalle.Columns[23].Header = r["T19_TMP"].ToString();
                                    dtgDetalle.Columns[24].Header = r["T20_TMP"].ToString();
                                }
                            }
                            else
                            {
                                StrLoteAProcesar = "";//FJRF - Asignamos el lote
                                BtnProcesar.Visibility = Visibility.Hidden;//FJRF - Ponemos el boton invisible

                                String StrMensajeError = MDOgeneral.spComando.Parameters["pva_errusu"].Value.ToString();//FJRF - Consultamos si podemos seguir o no
                                MessageBox.Show(StrMensajeError, "PROCESO CANCELADO", MessageBoxButton.OK, MessageBoxImage.Error);
                            }
                        }
                    }
                }
            }
            catch (Exception ex) { } //MessageBox.Show(ex.Message);
        }


        private void dtgDetalle_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            if (dtgDetalle.SelectedItems.Count > 0)
            {
                MMontajeaDespachos.detalle fila = (MMontajeaDespachos.detalle)dtgDetalle.SelectedItems[0];
                if (fila != null)
                {
                    strTalla = fila.strTalla;

                    MDOgeneral.spComando.CommandText = "SP_TALLAJES";
                    MDOgeneral.spComando.Connection = MDOgeneral.conexion;
                    MDOgeneral.spComando.CommandType = CommandType.StoredProcedure;
                    MDOgeneral.spComando.Parameters.Clear();

                    //Input
                    MDOgeneral.spComando.Parameters.Add("pva_tallajes", Oracle.DataAccess.Client.OracleDbType.Varchar2, 20).Value = strTalla;
                    MDOgeneral.spComando.Parameters["pva_tallajes"].Direction = ParameterDirection.Input;

                    //Output
                    MDOgeneral.spComando.Parameters.Add("pva_result", Oracle.DataAccess.Client.OracleDbType.Varchar2, 2000).Direction = ParameterDirection.Output;
                    MDOgeneral.spComando.Parameters.Add("pva_errusu", Oracle.DataAccess.Client.OracleDbType.Varchar2, 2000).Direction = ParameterDirection.Output;
                    MDOgeneral.spComando.ExecuteNonQuery();

                    string query1 = "select * from tmptitulostalla";
                    DataTable dt = mod.consulta(query1);

                    foreach (DataRow r in dt.Rows)
                    {
                        dtgDetalle.Columns[5].Header = r["T1_TMP"].ToString();
                        dtgDetalle.Columns[6].Header = r["T2_TMP"].ToString();
                        dtgDetalle.Columns[7].Header = r["T3_TMP"].ToString();
                        dtgDetalle.Columns[8].Header = r["T4_TMP"].ToString();
                        dtgDetalle.Columns[9].Header = r["T5_TMP"].ToString();
                        dtgDetalle.Columns[10].Header = r["T6_TMP"].ToString();
                        dtgDetalle.Columns[11].Header = r["T7_TMP"].ToString();
                        dtgDetalle.Columns[12].Header = r["T8_TMP"].ToString();
                        dtgDetalle.Columns[13].Header = r["T9_TMP"].ToString();
                        dtgDetalle.Columns[14].Header = r["T10_TMP"].ToString();
                        dtgDetalle.Columns[15].Header = r["T11_TMP"].ToString();
                        dtgDetalle.Columns[16].Header = r["T12_TMP"].ToString();
                        dtgDetalle.Columns[17].Header = r["T13_TMP"].ToString();
                        dtgDetalle.Columns[18].Header = r["T14_TMP"].ToString();
                        dtgDetalle.Columns[19].Header = r["T15_TMP"].ToString();
                        dtgDetalle.Columns[20].Header = r["T16_TMP"].ToString();
                        dtgDetalle.Columns[21].Header = r["T17_TMP"].ToString();
                        dtgDetalle.Columns[22].Header = r["T18_TMP"].ToString();
                        dtgDetalle.Columns[23].Header = r["T19_TMP"].ToString();
                        dtgDetalle.Columns[24].Header = r["T20_TMP"].ToString();
                    }
                }
            }
        }

        private void BtnProcesar_Click(object sender, RoutedEventArgs e)
        {
            #region FJRF - ArmamosLaPregunta
            String StrCaptionBox = "Confirmation";
            String StrMensajeBox = "¿Desea procesar el lote " + StrLoteAProcesar + " ?";
            MessageBoxButton buttons = MessageBoxButton.YesNo;
            MessageBoxImage icon = MessageBoxImage.Question;
            #endregion

            if (MessageBox.Show(StrMensajeBox, StrCaptionBox, buttons, icon) == MessageBoxResult.Yes)
            {
                try//FJRF - Controlamos el error
                {
                    Mouse.OverrideCursor = Cursors.Wait;//FJRF - Ponemos una esfera en timpo de espera

                    String StrDatoRetornado = MdoGeneral.StrRetornarUnSoloCampo("MAX(LOTE_LPN)", "NumeroMaximo", "LECTPEND", "TIPO_LPN = 'OR' ");//FJRF - Buscamos el numero maximo
                    int IntNumeroLote;//FJRF - Para guardar el numero del lote

                    if (StrDatoRetornado == "DATO NO ENCONTRADO")//FJRF - Si no hay datos hacemos lo siguiente
                    {
                        MessageBox.Show("No se elimino el lote " + StrLoteAProcesar + " no hay datos para sacar el maximo numero", "PROCESO CANCELADO", MessageBoxButton.OK, MessageBoxImage.Error);//FJRF - Enviamos un mensaje al usuario
                        Mouse.OverrideCursor = Cursors.Arrow;//FJRF - Ponemos el cursor de forma normal nuevamente
                    }
                    else
                    {
                        IntNumeroLote = int.Parse(StrDatoRetornado) + 1;//FJRF - Al numero maximo le sumamos 1

                        MDOgeneral.strConsultasTemporalesSql1 = "INSERT INTO LECTPEND (SELECT " + IntNumeroLote + ", 'OR', NROORD_LPN, CODREF_LPN, CODCOL_LPN, CODTAL_LPN, CANPRO_LPN, FECHA_LPN, 'P',' ' FROM LECTPEND WHERE LOTE_LPN = '" + StrLoteAProcesar + "' AND TIPO_LPN = 'MD')";//FJRF - Armamos la consulta
                        MdoGeneral.consulta(MDOgeneral.strConsultasTemporalesSql1);//FJRF - Ejecutamos la consulta

                        StrLoteAProcesar = "";//FJRF - Asignamos el lote
                        BtnProcesar.Visibility = Visibility.Hidden;//FJRF - Ponemos el boton invisible

                        MessageBox.Show("Se proceso el lote " + StrLoteAProcesar + " ", "PROCESO EXITOSO", MessageBoxButton.OK, MessageBoxImage.Information);//FJRF - Enviamos un mensaje al usuario
                    }
                    Mouse.OverrideCursor = Cursors.Arrow;//FJRF - Ponemos el cursor de forma normal nuevamente
                }
                catch (Exception ex)//FJRF - Si se presenta algun error hacemos lo siguiente
                {
                    MessageBox.Show(ex.Message, "PROCESO CANCELADO", MessageBoxButton.OK, MessageBoxImage.Error);//FJRF - Enviamos un mensaje al usuario
                    Mouse.OverrideCursor = Cursors.Arrow;//FJRF - Ponemos el cursor de forma normal nuevamente
                }
            }
            else//FJRF - Si la respuesta es negativa
            {
                MessageBox.Show("No se proceso el lote " + StrLoteAProcesar + " ", "PROCESO CANCELADO", MessageBoxButton.OK, MessageBoxImage.Error);//FJRF - Enviamos un mensaje al usuario
                Mouse.OverrideCursor = Cursors.Arrow;//FJRF - Ponemos el cursor de forma normal nuevamente
            }

        }
    }
}
